#include "Comm.hpp"
#include <sys/wait.h>

void GetMessage(int fd)
{
    // 3,只读，进行进程间通信---ssize_t read(int fd, void *buf, size_t count);
    char buff[NUM]={0};
    while(true)
    {
        ssize_t n=read(fd,buff,sizeof(NUM)-1);
        buff[NUM-1]='\0';
        if(n==0)
        {
            break;
        }
        else if(n>0)
        {
            std::cout<<"["<<getpid()<<"]"<<"Information received from the client:>"<<buff<<std::endl;
        }
        else 
        {
        }
    }
}

int main(int,char**,char**)
{
    // 1,创建管道文件---int mkfifo(const char *pathname, mode_t mode);
    int fd=mkfifo(ipcPath.c_str(),0666);
    if(fd==-1)
    {
        perror("mkfifo");
        exit(1);
    }

    // 2,打开管道文件---int open(const char *pathname, int flags);
    fd = open(ipcPath.c_str(),O_RDONLY);
    if(fd<0)
    {
        perror("open");
        exit(2);
    }

    for(int i=0;i<PROCNUM;i++)
    {
        pid_t id=fork();
        if(id==0)
        {
            GetMessage(fd);
        }
        else if(id<0)
        {
            perror("fork");
        }
    }

    GetMessage(fd);

    // 回收子进程
    for(int i=0;i<PROCNUM;i++)
    {
        pid_t id =waitpid(-1,nullptr,0);
        if(id>0)
        {
            std::cout<<"回收成功"<<id<<std::endl;
        }
        else if(id<0)
        {
            std::cout<<"回收失败"<<id<<std::endl;
        }
    }

    // 4,关闭管道文件---int close(int fd);
    close(fd);

    // 5,删除管道文件---int unlink(const char *pathname);
    unlink(ipcPath.c_str());

    return 0;
}